package pe.com.cotelasa.scp.seguridad.modelo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.security.authentication.encoding.PasswordEncoder;
import org.springframework.stereotype.Component;

import pe.com.cotelasa.scp.dominio.excepcion.ModelExcepcion;
import pe.com.cotelasa.scp.dominio.excepcion.ServiceException;
import pe.com.cotelasa.seguridad.dominio.servicio.IServiceUsuario;
import pe.com.cotelasa.seguridad.dominio.servicio.IServicioEnviarCorreo;
import pe.com.cotelasa.seguridad.entidad.Usuario;

@Component("contracenaModel")
public class ContracenaModelImpl implements ContracenaModel {

    @Autowired
    private IServiceUsuario servicioUsuario;
    @Autowired
    @Qualifier("passwordEncoder")
    private PasswordEncoder passwordEncoder;
    @Autowired
    private IServicioEnviarCorreo servicioEnviarCorreo;
    @Autowired
    private IServicioEnviarCorreo servicioCorreo;

    @Override
    public void guardarCambioContracena(Integer idUsuario, String contracena)
            throws ModelExcepcion {
        try {
            Usuario beanUsuario = servicioUsuario.obtenerUsuarioPorId(idUsuario);
            String contracenaEncryptada = passwordEncoder.encodePassword(contracena, null);
            beanUsuario.setContracena(contracenaEncryptada);
            servicioUsuario.actualizarUsuario(beanUsuario);
            servicioEnviarCorreo.enviarCorreoCambioContracena(beanUsuario.getEmail());
        } catch (ServiceException e) {
            throw new ModelExcepcion(e);
        }
    }

    @Override
    public boolean validarContracenaActual(Integer idUsuario, String contracena)
            throws ModelExcepcion {
        try {
            Usuario usuario = servicioUsuario.obtenerUsuarioPorId(idUsuario);
            String contracenaActual = passwordEncoder.encodePassword(contracena, null);
            if (usuario.getContracena().equals(contracenaActual)) {
                return true;
            } else {
                return false;
            }
        } catch (ServiceException e) {
            throw new ModelExcepcion(e);
        }
    }

    @Override
    public void enviarCorreoError(Throwable e, String mensajeError) {
        try {
            servicioCorreo.enviarCorreoError(mensajeError, e);
        } catch (ServiceException e1) {
        }
    }
}
